home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 April
/
EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso
/
EARCD
/
comm
/
bbs
/
Hydra11s.lha
/
HBBS
/
Source
/
Test
/
Config
/
ConfigFiles.c
next >
Wrap
Text File
|
1996-06-25
|
5KB
|
183 lines
/*
these are how I used to do the config files.. they're much quicker now...
*/
V_ERROR __asm __saveds LIBHBBS_LoadConfig(register __a0 struct CfgFileData *cfgfile, register __a1 UBYTE *filename)
{
BPTR FH;
struct FileInfoBlock *FIB=NULL;
V_ERROR error=ERR_NO_ERROR;
LONG nr; //num bytes read!
if (!(FH=Open(filename,MODE_OLDFILE)))
{
error=LIBHBBS_LogError(BBSGlobal->ErrorLogFile,ERR_ERROR_OPENING,filename,TYPE_FATAL);
}
else // opened ok.
{
if (FIB=(struct FileInfoBlock *)AllocVec(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
{
ExamineFH(FH,FIB);
cfgfile->Length=FIB->fib_Size;
if (cfgfile->Data=AllocVec(cfgfile->Length,MEMF_PUBLIC))
{
if ((nr=Read(FH,cfgfile->Data,cfgfile->Length))!=cfgfile->Length)
{
FreeVec(cfgfile->Data);
cfgfile->Data=NULL;
cfgfile->Length=0;
error=LIBHBBS_LogError(BBSGlobal->ErrorLogFile,ERR_ERROR_READING,filename,TYPE_CRITICAL);
}
}
FreeVec(FIB);
} else error=TYPE_MEMORY;
Close(FH);
}
return(error);
}
void __asm __saveds LIBHBBS_FlushConfig(register __a0 struct CfgFileData *cfgfile)
{
if (cfgfile->Data) // just a smidgin of error checking... :-)
{
FreeMem(cfgfile->Data,cfgfile->Length);
cfgfile->Data=NULL;
}
cfgfile->Length=0;
}
V_SMALLNUM __asm __saveds LIBHBBS_GetSetting(register __a0 struct CfgFileData *cfgfile,register __a1 void **result,register __d0 V_FLAGS optiontype,register __a2 V_STRING optionstr,register __d1 V_BOOL multi)
{
// Now this is a beauty of a routine!
V_BIGNUM linenum=0;
V_BOOL done,nearlydone;
V_SMALLNUM found=0;
LONG filepos=0,bufferpos;
V_STRING buffer;
V_STRING ItemName;
V_STRING Params;
V_STRING CompareStr;
struct Node *node;
if (buffer=AllocMem(BIG_STR,MEMF_PUBLIC))
{
if (ItemName=AllocMem(BIG_STR,MEMF_PUBLIC))
{
if (Params=AllocMem(BIG_STR,MEMF_PUBLIC))
{
if (CompareStr=AllocMem(BIG_STR,MEMF_PUBLIC))
{
do
{
bufferpos=0;
done=FALSE;
nearlydone=FALSE; // :-) love those variable names! :-)
do
{
if (cfgfile->Data[filepos]=='\r' || cfgfile->Data[filepos]=='\n')
{
nearlydone=TRUE;
filepos++;
}
else
{
if (nearlydone)
{
done=TRUE;
}
else
{
buffer[bufferpos]=cfgfile->Data[filepos];
filepos++;
bufferpos++;
}
}
} while (filepos<cfgfile->Length && !done && bufferpos<BIG_STR-2); // 1 for null and 1 more cos we still have to add the null
buffer[bufferpos]=0;
linenum++;
LIBStripComments(buffer);
LIBStripSpaces(buffer);
LIBGetItem(ItemName,buffer);
LIBGetParams(Params,buffer);
if (ItemName[0])
{
if (multi==OPT_MULTI)
{
sprintf(CompareStr,"%s_%d",optionstr,found+1);
}
else strcpy(CompareStr,optionstr);
if (stricmp(CompareStr,ItemName)==0)
{
switch(optiontype)
{
case VTYPE_STRING:
if (*result!=NULL) LIBFreeStr(*result);
*result=(V_STRING *)LIBDupStr(Params);
found++;
break;
case VTYPE_BOOL:
*result=(V_BOOL *)LIBCheckBoolean(Params);
found++;
break;
case VTYPE_BIGNUM:
*result=(V_BIGNUM *)atoi(Params);
found++;
break;
case VTYPE_SMALLNUM:
*result=(V_SMALLNUM *)atoi(Params);
found++;
break;
case VTYPE_STRINGLIST:
// free existing stringlist if present
if ((found==0) && (*result))
{
LIBFreeStrList((V_STRINGLIST)*result);
}
if (!(*result))
{
if(*result=AllocMem(sizeof (struct List),MEMF_PUBLIC))
{
NewList((struct List*)*result);
}
}
if (*result) // allocated new list ok ?
{
if (node=AllocMem(sizeof(struct Node),MEMF_PUBLIC))
{
if (!(node->ln_Name=LIBDupStr(Params)))
{
FreeMem(node,sizeof(struct Node));
}
else
{
AddTail((struct List *)*result,node);
found++;
}
}
}
}
}
}
} while (filepos<cfgfile->Length && ((multi==OPT_SINGLE && !found) || (multi==OPT_MULTI)));
FreeMem(CompareStr,BIG_STR);
}
FreeMem(Params,BIG_STR);
}
FreeMem(ItemName,BIG_STR);
}
FreeMem(buffer,BIG_STR);
}
return(found);
}